sources <- c("ESPN", "FantasyData", "FantasyPros", "FantasySharks", 
             "FantasyFootballNerd", "NumberFire", "Yahoo",
             "RTSports", "Walterfootball")

scrape <- scrape_data(src = sources,
                      pos = c('QB', 'RB', 'WR', 'TE', 'DST'),
                      season = 2020, 
                      week = week)

Simulation Time!

n_sims <- 10000

tic()
sim_lu <- map_df(1:n_sims, generate_lineup) %>%
  rename(pts_base = points) %>%  
  mutate(position = factor(position, 
                           levels = c("QB", "RB", "WR", "TE", "DST"))) %>% 
  select(lineup, Name, team, position, pts_base, pts_pred, sd_pts, Salary)
toc()
## 659.591 sec elapsed

Results

ggplotly(sim_lu %>% 
           group_by(Name, position, Salary) %>% 
           dplyr::summarize(lu = n_distinct(lineup)) %>% 
           ungroup() %>% 
           group_by(position) %>% 
           top_n(10, lu) %>% 
           ungroup() %>% 
           arrange(position, desc(lu)) %>% 
           mutate(Name = factor(Name),
                  Name = fct_reorder(Name, lu),
                  pct = round(lu / n_sims, 3) * 100) %>% 
           ggplot(aes(x = Name, y = pct, fill = Salary,
                      text = paste(Name, "in", lu, "lineups with", Salary, "salary"))) +
           geom_bar(stat = "identity") +
           facet_wrap(~position, ncol = 2, scales = "free_y") +
           coord_flip() +
           scale_fill_viridis_c() +
           xlab("") +
           ylab("Lineups (thousands)") +
           ggtitle("Top 10 Players By Position")) %>% 
  ggplotly(tooltip = "text")
plyr_lu <- sim_lu %>%
  group_by(Name, position) %>%
  dplyr::summarize(lu=n_distinct(lineup)) %>%
  ungroup() 

ggplotly(projections %>% 
  filter(avg_type=='weighted') %>%
  mutate(Name = ifelse(pos=="DST", last_name, paste(first_name, last_name))) %>%
  inner_join(fan_duel, by = c("Name", "position")) %>%
  select(Name, team, position, points, Salary, sd_pts) %>%
  left_join(plyr_lu, by='Name') %>%
  replace_na(list(lu=0)) %>%
  mutate(lu_bin=ifelse(lu==0, '0 Lineups', '>=1 Lineups'),
         lu_5=cut(lu,5, labels = FALSE)) %>%
  ggplot(aes(x=Salary, y=points, color=lu_bin, size=sd_pts, text=Name)) +
  geom_point() +
  theme_minimal() +
  scale_color_manual(values = c('red', 'blue'), name="") +
  geom_smooth(inherit.aes = FALSE, aes(x=Salary, y=points), method = 'lm') +
  ylab('Projected Points') +
  xlab('Salary') +
  ggtitle('Who makes it into Optimized Lineups?') +
  scale_x_continuous(labels=scales::dollar))
lu_df <- sim_lu %>%
  group_by(lineup) %>%
  dplyr::summarize(lineup_pts=sum(pts_pred),
                   lineup_sd=sum(sd_pts)) %>%
  ungroup()

pto <- psel(lu_df, low(lineup_sd) * high(lineup_pts))


ggplotly(ggplot(lu_df, aes(y=lineup_pts, x=lineup_sd, text = paste0("Lineup: ", lineup))) +
  geom_point() +
  geom_point(data=pto, size=5) +
  ylab('Lineup Points') +
  xlab('Lineup Points St Dev') +
  ggtitle('Lineup Points vs. Uncertainty',
          subtitle = 'Pareto Lineups Bolded'))
psel(lu_df, low(lineup_sd) * high(lineup_pts)) %>%
  left_join(sim_lu, by='lineup') %>%
  group_by(lineup) %>%
  arrange(lineup_pts, position, desc(Salary)) %>%
  select(lineup, lineup_pts, lineup_sd, Name, team, position, pts_pred, sd_pts, Salary) %>%
  mutate_at(vars(lineup_pts, lineup_sd, pts_pred, sd_pts), function(x) round(x, 2)) %>%
  knitr::kable() %>%
  kable_styling(fixed_thead = T) %>%
  column_spec(1:3, bold=TRUE) %>%
  collapse_rows(columns = 1:3, valign = 'top') %>%
  scroll_box(height = '700px', width = '100%')
lineup lineup_pts lineup_sd Name team position pts_pred sd_pts Salary
4135 127.50 2.90 Lamar Jackson BAL QB 24.24 1.00 8200
Alvin Kamara NOS RB 19.66 1.06 7800
James Robinson JAC RB 14.92 0.04 7000
D’Andre Swift DET RB 13.97 0.04 6700
Cooper Kupp LAR WR 13.26 0.04 7100
Brandon Aiyuk SFO WR 13.33 0.03 6900
Kendrick Bourne SFO WR 7.94 0.08 4800
Travis Kelce KCC TE 15.07 0.57 8500
New York Jets NYJ DST 5.10 0.04 3000
3621 130.13 3.19 Lamar Jackson BAL QB 26.09 1.00 8200
Alvin Kamara NOS RB 19.47 1.06 7800
Jonathan Taylor IND RB 16.72 0.70 7400
James Robinson JAC RB 14.86 0.04 7000
Robert Woods LAR WR 13.57 0.02 7400
Cooper Kupp LAR WR 13.17 0.04 7100
Brandon Aiyuk SFO WR 13.36 0.03 6900
Jordan Reed SFO TE 7.86 0.25 5100
New York Jets NYJ DST 5.02 0.04 3000
1524 130.15 4.48 Lamar Jackson BAL QB 24.81 1.00 8200
Dalvin Cook MIN RB 19.00 0.30 9400
Alvin Kamara NOS RB 19.91 1.06 7800
James Robinson JAC RB 14.88 0.04 7000
Terry McLaurin WAS WR 12.89 0.12 6900
Brandon Aiyuk SFO WR 13.37 0.03 6900
Emmanuel Sanders NOS WR 10.67 0.55 5500
Zach Ertz PHI TE 9.61 1.32 5300
New York Jets NYJ DST 5.00 0.04 3000
6204 131.66 4.74 Lamar Jackson BAL QB 24.23 1.00 8200
Alvin Kamara NOS RB 20.41 1.06 7800
James Robinson JAC RB 14.88 0.04 7000
J.D. McKissic WAS RB 12.22 0.19 5800
Terry McLaurin WAS WR 13.07 0.12 6900
Brandon Aiyuk SFO WR 13.33 0.03 6900
Amari Cooper DAL WR 15.35 1.33 6700
T.J. Hockenson DET TE 9.63 0.37 6200
Seattle Seahawks SEA DST 8.55 0.61 4500
62 131.71 4.81 Lamar Jackson BAL QB 26.45 1.00 8200
Alvin Kamara NOS RB 18.57 1.06 7800
Jonathan Taylor IND RB 17.47 0.70 7400
James Robinson JAC RB 14.84 0.04 7000
Terry McLaurin WAS WR 13.23 0.12 6900
Brandon Aiyuk SFO WR 13.35 0.03 6900
Amari Cooper DAL WR 12.88 1.33 6700
Jordan Reed SFO TE 7.69 0.25 5100
Tampa Bay Buccaneers TBB DST 7.23 0.28 4000
3659 132.96 5.11 Lamar Jackson BAL QB 24.01 1.00 8200
Alvin Kamara NOS RB 21.13 1.06 7800
James Robinson JAC RB 14.91 0.04 7000
Cam Akers LAR RB 14.19 0.34 6700
Terry McLaurin WAS WR 13.03 0.12 6900
Brandon Aiyuk SFO WR 13.32 0.03 6900
Amari Cooper DAL WR 14.84 1.33 6700
Mark Andrews BAL TE 12.50 1.16 6800
New York Jets NYJ DST 5.03 0.04 3000
6614 134.00 5.74 Deshaun Watson HOU QB 25.42 1.82 8100
Alvin Kamara NOS RB 19.88 1.06 7800
James Robinson JAC RB 14.86 0.04 7000
Sony Michel NEP RB 11.90 0.81 5000
Calvin Ridley ATL WR 16.74 0.66 8400
Terry McLaurin WAS WR 13.07 0.12 6900
Brandon Aiyuk SFO WR 13.35 0.03 6900
Mark Andrews BAL TE 13.63 1.16 6800
New York Jets NYJ DST 5.15 0.04 3000
3899 135.28 6.23 Lamar Jackson BAL QB 25.65 1.00 8200
Alvin Kamara NOS RB 20.57 1.06 7800
James Robinson JAC RB 14.87 0.04 7000
Leonard Fournette TBB RB 15.98 1.64 5500
Tyreek Hill KCC WR 17.71 0.71 9300
Brandon Aiyuk SFO WR 13.35 0.03 6900
Emmanuel Sanders NOS WR 10.62 0.55 5500
Mark Andrews BAL TE 11.50 1.16 6800
New York Jets NYJ DST 5.03 0.04 3000
4736 135.50 6.99 Lamar Jackson BAL QB 25.49 1.00 8200
Alvin Kamara NOS RB 18.97 1.06 7800
J.D. McKissic WAS RB 12.12 0.19 5800
Leonard Fournette TBB RB 16.71 1.64 5500
Calvin Ridley ATL WR 17.08 0.66 8400
Brandin Cooks HOU WR 12.98 1.20 6600
Emmanuel Sanders NOS WR 10.53 0.55 5500
Travis Kelce KCC TE 15.45 0.57 8500
Philadelphia Eagles PHI DST 6.17 0.13 3700
9573 136.37 7.05 Lamar Jackson BAL QB 25.94 1.00 8200
Alvin Kamara NOS RB 19.64 1.06 7800
D’Andre Swift DET RB 13.90 0.04 6700
Leonard Fournette TBB RB 14.41 1.64 5500
Calvin Ridley ATL WR 17.14 0.66 8400
Tyler Lockett SEA WR 14.21 0.92 7400
Amari Cooper DAL WR 16.19 1.33 6700
T.J. Hockenson DET TE 9.88 0.37 6200
New York Jets NYJ DST 5.06 0.04 3000
3336 136.74 7.26 Kyler Murray ARI QB 24.35 1.45 8000
Alvin Kamara NOS RB 20.21 1.06 7800
James Robinson JAC RB 14.93 0.04 7000
Leonard Fournette TBB RB 16.47 1.64 5500
Calvin Ridley ATL WR 15.95 0.66 8400
Brandon Aiyuk SFO WR 13.34 0.03 6900
Brandin Cooks HOU WR 12.79 1.20 6600
Mark Andrews BAL TE 13.74 1.16 6800
New York Jets NYJ DST 4.95 0.04 3000
3425 137.53 7.53 Lamar Jackson BAL QB 24.19 1.00 8200
Derrick Henry TEN RB 28.16 1.85 10200
Alvin Kamara NOS RB 17.87 1.06 7800
Leonard Fournette TBB RB 14.35 1.64 5500
Robert Woods LAR WR 13.60 0.02 7400
Cooper Kupp LAR WR 13.23 0.04 7100
Emmanuel Sanders NOS WR 11.09 0.55 5500
Zach Ertz PHI TE 10.04 1.32 5300
New York Jets NYJ DST 4.99 0.04 3000
5963 137.75 8.03 Lamar Jackson BAL QB 25.20 1.00 8200
Derrick Henry TEN RB 27.87 1.85 10200
Alvin Kamara NOS RB 17.51 1.06 7800
Leonard Fournette TBB RB 15.16 1.64 5500
A.J. Brown TEN WR 16.08 0.63 8300
Keke Coutee HOU WR 10.81 0.62 5900
Emmanuel Sanders NOS WR 11.49 0.55 5500
Jordan Reed SFO TE 7.57 0.25 5100
Atlanta Falcons ATL DST 6.05 0.43 3500
943 139.51 8.85 Lamar Jackson BAL QB 24.65 1.00 8200
Alvin Kamara NOS RB 19.74 1.06 7800
Jonathan Taylor IND RB 17.01 0.70 7400
Leonard Fournette TBB RB 16.16 1.64 5500
Terry McLaurin WAS WR 12.96 0.12 6900
Brandon Aiyuk SFO WR 13.33 0.03 6900
Denzel Mims NYJ WR 13.83 2.39 5500
Mark Andrews BAL TE 12.19 1.16 6800
Los Angeles Rams LAR DST 9.64 0.76 5000
4180 140.49 9.00 Lamar Jackson BAL QB 22.62 1.00 8200
Alvin Kamara NOS RB 20.38 1.06 7800
Cam Akers LAR RB 14.47 0.34 6700
Tony Pollard DAL RB 23.55 5.81 4700
Cooper Kupp LAR WR 13.22 0.04 7100
Terry McLaurin WAS WR 12.94 0.12 6900
Brandon Aiyuk SFO WR 13.40 0.03 6900
Travis Kelce KCC TE 14.87 0.57 8500
New York Jets NYJ DST 5.04 0.04 3000
1083 141.14 9.45 Lamar Jackson BAL QB 24.81 1.00 8200
Alvin Kamara NOS RB 20.80 1.06 7800
Jonathan Taylor IND RB 16.40 0.70 7400
Leonard Fournette TBB RB 16.20 1.64 5500
Adam Thielen MIN WR 17.24 1.73 7500
Amari Cooper DAL WR 13.11 1.33 6700
Emmanuel Sanders NOS WR 11.03 0.55 5500
Mark Andrews BAL TE 14.31 1.16 6800
Tampa Bay Buccaneers TBB DST 7.24 0.28 4000
8093 142.36 9.78 Lamar Jackson BAL QB 25.27 1.00 8200
James Robinson JAC RB 14.91 0.04 7000
J.D. McKissic WAS RB 12.25 0.19 5800
Tony Pollard DAL RB 24.63 5.81 4700
Cooper Kupp LAR WR 13.21 0.04 7100
Brandon Aiyuk SFO WR 13.32 0.03 6900
Amari Cooper DAL WR 14.07 1.33 6700
Travis Kelce KCC TE 15.43 0.57 8500
Los Angeles Rams LAR DST 9.27 0.76 5000
3598 144.80 9.96 Lamar Jackson BAL QB 25.23 1.00 8200
James Robinson JAC RB 14.89 0.04 7000
Leonard Fournette TBB RB 13.07 1.64 5500
Tony Pollard DAL RB 27.40 5.81 4700
Tyreek Hill KCC WR 17.85 0.71 9300
Terry McLaurin WAS WR 12.93 0.12 6900
Brandon Aiyuk SFO WR 13.33 0.03 6900
Travis Kelce KCC TE 15.01 0.57 8500
New York Jets NYJ DST 5.10 0.04 3000
2261 145.99 10.32 Lamar Jackson BAL QB 22.44 1.00 8200
Alvin Kamara NOS RB 18.18 1.06 7800
J.D. McKissic WAS RB 12.08 0.19 5800
Tony Pollard DAL RB 31.38 5.81 4700
A.J. Brown TEN WR 16.31 0.63 8300
DK Metcalf SEA WR 15.44 0.46 8200
Emmanuel Sanders NOS WR 9.86 0.55 5500
Travis Kelce KCC TE 15.23 0.57 8500
New York Jets NYJ DST 5.07 0.04 3000
8431 146.21 10.91 Kyler Murray ARI QB 24.45 1.45 8000
Alvin Kamara NOS RB 18.25 1.06 7800
James Robinson JAC RB 14.95 0.04 7000
Tony Pollard DAL RB 27.57 5.81 4700
Tyreek Hill KCC WR 18.13 0.71 9300
Robert Woods LAR WR 13.57 0.02 7400
Keke Coutee HOU WR 11.40 0.62 5900
Mark Andrews BAL TE 12.84 1.16 6800
New York Jets NYJ DST 5.06 0.04 3000
2180 147.08 11.01 Lamar Jackson BAL QB 24.93 1.00 8200
Alvin Kamara NOS RB 17.62 1.06 7800
James Robinson JAC RB 14.86 0.04 7000
Tony Pollard DAL RB 27.40 5.81 4700
Calvin Ridley ATL WR 16.54 0.66 8400
Brandon Aiyuk SFO WR 13.33 0.03 6900
Brandin Cooks HOU WR 13.91 1.20 6600
Mark Andrews BAL TE 12.55 1.16 6800
Dallas Cowboys DAL DST 5.94 0.06 3600
8277 150.29 11.06 Lamar Jackson BAL QB 23.88 1.00 8200
Alvin Kamara NOS RB 19.62 1.06 7800
Jonathan Taylor IND RB 16.46 0.70 7400
Tony Pollard DAL RB 31.05 5.81 4700
Tyreek Hill KCC WR 17.74 0.71 9300
Brandon Aiyuk SFO WR 13.37 0.03 6900
Emmanuel Sanders NOS WR 10.81 0.55 5500
Mark Andrews BAL TE 12.30 1.16 6800
New York Jets NYJ DST 5.06 0.04 3000
3120 150.34 11.22 Lamar Jackson BAL QB 25.94 1.00 8200
Alvin Kamara NOS RB 19.98 1.06 7800
Sony Michel NEP RB 10.80 0.81 5000
Tony Pollard DAL RB 29.31 5.81 4700
Tyreek Hill KCC WR 17.92 0.71 9300
Brandon Aiyuk SFO WR 13.39 0.03 6900
Brandin Cooks HOU WR 13.47 1.20 6600
Travis Kelce KCC TE 14.52 0.57 8500
New York Jets NYJ DST 5.02 0.04 3000
5351 152.86 12.24 Lamar Jackson BAL QB 24.20 1.00 8200
Alvin Kamara NOS RB 20.04 1.06 7800
Jonathan Taylor IND RB 17.68 0.70 7400
Tony Pollard DAL RB 31.53 5.81 4700
Tyreek Hill KCC WR 18.49 0.71 9300
Amari Cooper DAL WR 13.20 1.33 6700
Emmanuel Sanders NOS WR 10.04 0.55 5500
T.J. Hockenson DET TE 10.08 0.37 6200
San Francisco 49ers SFO DST 7.59 0.71 4200
1261 153.08 13.15 Lamar Jackson BAL QB 23.92 1.00 8200
Alvin Kamara NOS RB 18.74 1.06 7800
Leonard Fournette TBB RB 15.48 1.64 5500
Tony Pollard DAL RB 30.01 5.81 4700
Calvin Ridley ATL WR 16.34 0.66 8400
Adam Thielen MIN WR 16.44 1.73 7500
Emmanuel Sanders NOS WR 11.43 0.55 5500
Travis Kelce KCC TE 14.28 0.57 8500
Philadelphia Eagles PHI DST 6.43 0.13 3700
1666 153.87 14.07 Lamar Jackson BAL QB 25.55 1.00 8200
Derrick Henry TEN RB 24.82 1.85 10200
Alvin Kamara NOS RB 20.49 1.06 7800
Tony Pollard DAL RB 27.31 5.81 4700
Amari Cooper DAL WR 14.02 1.33 6700
Brandin Cooks HOU WR 13.22 1.20 6600
Keke Coutee HOU WR 11.47 0.62 5900
Mark Andrews BAL TE 11.96 1.16 6800
New York Jets NYJ DST 5.01 0.04 3000
5382 155.21 15.01 Jalen Hurts PHI QB 22.58 2.51 6900
Alvin Kamara NOS RB 19.91 1.06 7800
Leonard Fournette TBB RB 16.56 1.64 5500
Tony Pollard DAL RB 28.18 5.81 4700
Tyreek Hill KCC WR 18.15 0.71 9300
Calvin Ridley ATL WR 16.25 0.66 8400
Brandin Cooks HOU WR 13.74 1.20 6600
Mark Andrews BAL TE 12.95 1.16 6800
Tampa Bay Buccaneers TBB DST 6.89 0.28 4000